#pragma once

/* compl patch, 应该在compl.h最后include, 不能单独使用 */

#ifndef __clang__ 
	/* gcc 没有assume */
	// #define __builtin_assume(cond)	  if(!(cond)) UNREACHABLE()
	/* GCC-13 增加的 */
	// #define __builtin_assume(cond)	  __attribute__((assume(cond)))
	/* 还有一个fallthrough用于标记case, 
		参考https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html#Statement-Attributes */
	#define __builtin_assume(expr) \
	(__builtin_pure_p(expr) \
		? ((expr) \
			? (void) 0 \
			: __builtin_unreachable()) \
		: (void) 0 /* XXX: warn about side effects */)
	#define __builtin_pure_p(expr) \
	(__builtin_object_size(((void) (expr), ""), 2))
#endif

/* clang patch */
#ifdef __clang__
	#undef  OPTIMIZE
	#define OPTIMIZE(x)
	#undef  UNROLL_LOOPS
	#undef NO_UNROLL
	#define UNROLL_LOOPS
	#define NO_UNROLL
#endif

/* cpp patch */
#ifdef __cplusplus
	#undef  HANDLE_MEFF
	#define HANDLE_MEFF(a, b)
#endif

/* compcert-c patch */
#ifdef __COMPCERT_C__
	#undef TIF_ELSE
	#define TIF_ELSE(expr, exp1, exp2)	(expr)?(exp1):(exp2)
#endif
